home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / goindol.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  6KB  |  237 lines

  1. /***************************************************************************
  2.   Goindol
  3.  
  4.   Functions to emulate the video hardware of the machine.
  5.  
  6. ***************************************************************************/
  7.  
  8. #include "driver.h"
  9.  
  10. unsigned char           *goindol_bg_videoram;
  11. unsigned char           *goindol_fg_videoram;
  12. unsigned char          *goindol_spriteram1;
  13. unsigned char          *goindol_spriteram2;
  14. unsigned char          *goindol_fg_scrollx;
  15. unsigned char          *goindol_fg_scrolly;
  16. static struct osd_bitmap *bitmap_bg;
  17. static struct osd_bitmap *bitmap_fg;
  18. static unsigned char      *fg_dirtybuffer;
  19. static unsigned char      *bg_dirtybuffer;
  20.  
  21. size_t goindol_fg_videoram_size;
  22. size_t goindol_bg_videoram_size;
  23. size_t goindol_spriteram_size;
  24. int               goindol_char_bank;
  25.  
  26.  
  27. /***************************************************************************
  28.  
  29.   Convert the color PROMs into a more useable format.
  30.  
  31. ***************************************************************************/
  32. void goindol_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
  33. {
  34.     int i;
  35.     #define TOTAL_COLORS(gfxn) (Machine->gfx[gfxn]->total_colors * Machine->gfx[gfxn]->color_granularity)
  36.     #define COLOR(gfxn,offs) (colortable[Machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
  37.  
  38.     for (i = 0;i < Machine->drv->total_colors;i++)
  39.     {
  40.         int bit0,bit1,bit2,bit3;
  41.  
  42.         bit0 = (color_prom[0] >> 0) & 0x01;
  43.         bit1 = (color_prom[0] >> 1) & 0x01;
  44.         bit2 = (color_prom[0] >> 2) & 0x01;
  45.         bit3 = (color_prom[0] >> 3) & 0x01;
  46.         *(palette++) = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
  47.         bit0 = (color_prom[Machine->drv->total_colors] >> 0) & 0x01;
  48.         bit1 = (color_prom[Machine->drv->total_colors] >> 1) & 0x01;
  49.         bit2 = (color_prom[Machine->drv->total_colors] >> 2) & 0x01;
  50.         bit3 = (color_prom[Machine->drv->total_colors] >> 3) & 0x01;
  51.         *(palette++) = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
  52.         bit0 = (color_prom[2*Machine->drv->total_colors] >> 0) & 0x01;
  53.         bit1 = (color_prom[2*Machine->drv->total_colors] >> 1) & 0x01;
  54.         bit2 = (color_prom[2*Machine->drv->total_colors] >> 2) & 0x01;
  55.         bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01;
  56.         *(palette++) = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3;
  57.         color_prom++;
  58.     }
  59.  
  60.     /* characters */
  61.  
  62.     for (i = 0;i < 256;i++)
  63.             COLOR(0,i) = i;
  64. }
  65.  
  66.  
  67. WRITE_HANDLER( goindol_fg_videoram_w )
  68. {
  69.     if (goindol_fg_videoram[offset] != data)
  70.     {
  71.         fg_dirtybuffer[offset >> 1] = 1;
  72.         goindol_fg_videoram[offset] = data;
  73.     }
  74. }
  75.  
  76. WRITE_HANDLER( goindol_bg_videoram_w )
  77. {
  78.     if (goindol_bg_videoram[offset] != data)
  79.     {
  80.         bg_dirtybuffer[offset >> 1] = 1;
  81.         goindol_bg_videoram[offset] = data;
  82.     }
  83. }
  84.  
  85. int goindol_vh_start(void)
  86. {
  87.         if ((fg_dirtybuffer = malloc(32*32)) == 0)
  88.     {
  89.             return 1;
  90.     }
  91.         if ((bg_dirtybuffer = malloc(32*32)) == 0)
  92.     {
  93.         free(bg_dirtybuffer);
  94.             return 1;
  95.     }
  96.     if ((bitmap_fg = osd_new_bitmap (Machine->drv->screen_width,Machine->drv->screen_height,Machine->scrbitmap->depth)) == 0)
  97.     {
  98.         free(fg_dirtybuffer);
  99.         free(bg_dirtybuffer);
  100.         return 1;
  101.     }
  102.     if ((bitmap_bg = osd_new_bitmap (Machine->drv->screen_width,Machine->drv->screen_height,Machine->scrbitmap->depth)) == 0)
  103.     {
  104.         osd_free_bitmap(bitmap_fg);
  105.         free(fg_dirtybuffer);
  106.         free(bg_dirtybuffer);
  107.         return 1;
  108.     }
  109.         memset(fg_dirtybuffer,1,32*32);
  110.         memset(bg_dirtybuffer,1,32*32);
  111.         return 0;
  112. }
  113.  
  114. void goindol_vh_stop(void)
  115. {
  116.     free(fg_dirtybuffer);
  117.     free(bg_dirtybuffer);
  118.     osd_free_bitmap(bitmap_fg);
  119.     osd_free_bitmap(bitmap_bg);
  120. }
  121.  
  122. void goindol_draw_background(struct osd_bitmap *bitmap)
  123. {
  124.     int x,y,offs;
  125.     int sx,sy,tile,palette,lo,hi;
  126.  
  127.     /* for every character in the Video RAM, check if it has been modified */
  128.     /* since last time and update it accordingly. */
  129.  
  130.     for (x = 0; x < 32; x++)
  131.     {
  132.         for (y = 0; y < 32; y++)
  133.         {
  134.             offs = y*64+(x*2);
  135.             if (bg_dirtybuffer[offs >> 1])
  136.             {
  137.                 sx = x << 3;
  138.                 sy = y << 3;
  139.  
  140.                 bg_dirtybuffer[offs >> 1] = 0;
  141.  
  142.                 hi = goindol_bg_videoram[offs];
  143.                 lo = goindol_bg_videoram[offs+1];
  144.                 tile = ((hi & 0x7) << 8) | lo;
  145.                 palette = hi >> 3;
  146.                 drawgfx(bitmap,Machine->gfx[1],
  147.                           tile,
  148.                           palette,
  149.                           0,0,
  150.                           sx,sy,
  151.                           0,TRANSPARENCY_NONE,0);
  152.             }
  153.         }
  154.     }
  155. }
  156.  
  157. void goindol_draw_foreground(struct osd_bitmap *bitmap)
  158. {
  159.     int x,y,offs;
  160.     int sx,sy,tile,palette,lo,hi;
  161.  
  162.     for (x = 0; x < 32; x++)
  163.     {
  164.         for (y = 0; y < 32; y++)
  165.         {
  166.             offs = y*64+(x*2);
  167.             if (fg_dirtybuffer[offs >> 1])
  168.             {
  169.                 sx = x << 3;
  170.                 sy = y << 3;
  171.  
  172.                 fg_dirtybuffer[offs >> 1] = 0;
  173.  
  174.                 hi = goindol_fg_videoram[offs];
  175.                 lo = goindol_fg_videoram[offs+1];
  176.                 tile = ((hi & 0x7) << 8) | lo;
  177.                 palette = hi >> 3;
  178.                 drawgfx(bitmap,Machine->gfx[0],
  179.                           tile+(goindol_char_bank << 7),
  180.                           palette,
  181.                           0,0,
  182.                           sx,sy,
  183.                           0,TRANSPARENCY_NONE,0);
  184.             }
  185.         }
  186.     }
  187.  
  188. }
  189.  
  190. void goindol_draw_sprites(struct osd_bitmap *bitmap, int gfxbank, unsigned char *sprite_ram)
  191. {
  192.     int offs,sx,sy,tile,palette;
  193.  
  194.     for (offs = 0 ;offs < goindol_spriteram_size; offs+=4)
  195.     {
  196.         sx = sprite_ram[offs];
  197.         sy = 240-sprite_ram[offs+1];
  198.  
  199.         if ((sprite_ram[offs+1] >> 3) && (sx < 248))
  200.         {
  201.             tile     = ((sprite_ram[offs+3])+((sprite_ram[offs+2] & 7) << 8));
  202.             tile    += tile;
  203.             palette     = sprite_ram[offs+2] >> 3;
  204.  
  205.             drawgfx(bitmap,Machine->gfx[gfxbank],
  206.                         tile,
  207.                         palette,
  208.                         0,0,
  209.                         sx,sy,
  210.                         &Machine->drv->visible_area,
  211.                         TRANSPARENCY_PEN, 0);
  212.             drawgfx(bitmap,Machine->gfx[gfxbank],
  213.                         tile+1,
  214.                         palette,
  215.                         0,0,
  216.                         sx,sy+8,
  217.                         &Machine->drv->visible_area,
  218.                         TRANSPARENCY_PEN, 0);
  219.         }
  220.     }
  221. }
  222.  
  223. void goindol_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  224. {
  225.     int fg_scrollx,fg_scrolly;
  226.  
  227.     fg_scrollx = -*goindol_fg_scrollx;
  228.     fg_scrolly = -*goindol_fg_scrolly;
  229.  
  230.     goindol_draw_background(bitmap_bg);
  231.     goindol_draw_foreground(bitmap_fg);
  232.     copybitmap(bitmap,bitmap_bg,0,0,0,0,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  233.     copyscrollbitmap(bitmap,bitmap_fg,1,&fg_scrolly,1,&fg_scrollx,&Machine->drv->visible_area,TRANSPARENCY_COLOR, 0);
  234.     goindol_draw_sprites(bitmap,1,goindol_spriteram1);
  235.     goindol_draw_sprites(bitmap,0,goindol_spriteram2);
  236. }
  237.